home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume16 / lumberjack < prev    next >
Encoding:
Internet Message Format  |  1988-11-14  |  15.1 KB

  1. Subject:  v16i084:  Logfile monitor tool for Suns
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4.  
  5. Submitted-by: Steven Grimm <koreth@ssyx.ucsc.edu>
  6. Posting-number: Volume 16, Issue 84
  7. Archive-name: lumberjack
  8.  
  9. [  I have no idea where the name came from...  --r$  ]
  10.  
  11. Enclosed is a program which monitors logfiles.  It will alert the user to
  12. changes in one of the monitored files when in icon form (described in the
  13. manual page).  It has been compiled and tested on SunOS 3.4, but should
  14. work with more recent versions of SunOS as well.
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before the "#! /bin/sh" line,
  18. # then unpack it by saving it in a file and typing "sh file."
  19. # Contents : Makefile ljack.c ljack.l new1.icon new2.icon none.icon
  20. if `test ! -s Makefile`
  21. then
  22. echo "x - Makefile"
  23. cat > Makefile << '@\Rogue\Monster\'
  24. LIBS=-lsuntool -lsunwindow -lpixrect
  25. CFLAGS=-pipe
  26.  
  27. ljack: ljack.c new1.icon new2.icon none.icon
  28.     $(CC) $(CFLAGS) -o $@ ljack.c $(LIBS)
  29.  
  30. install: ljack
  31.     install -s -c ljack /usr/local
  32.  
  33. clean:
  34.     rm ljack
  35. @\Rogue\Monster\
  36. else
  37.   echo "shar: Will not over write Makefile"
  38. fi
  39. if `test ! -s ljack.c`
  40. then
  41. echo "x - ljack.c"
  42. cat > ljack.c << '@\Rogue\Monster\'
  43. #include <stdio.h>
  44. #include <values.h>
  45. #include <signal.h>
  46. #include <sys/types.h>
  47. #include <sys/stat.h>
  48. #include <sys/file.h>
  49. #include <sys/time.h>
  50. #include <suntool/sunview.h>
  51. #include <suntool/frame.h>
  52. #include <suntool/textsw.h>
  53. #include <sunwindow/notify.h>
  54.  
  55. /*
  56.  * SunView size definitions.  I shouldn't have to define these, but
  57.  * there is no way to query SunView for them.
  58.  */
  59. #define LMARGIN        5    /* left frame margin */
  60. #define RMARGIN        5    /* right frame margin */
  61. #define BMARGIN        5    /* bottom frame margin */
  62. #define SMARGIN        5    /* subwindow spacing */
  63.  
  64. Frame    frame;
  65. int    files, updating = 0;
  66. Textsw    text[16];        /* text subwindows */
  67. Menu    menu[16];        /* menus for each subwindow */
  68. char    *file[16];        /* filenames */
  69. off_t    length[16];        /* file lengths */
  70. char    alert[16];        /* flags: blink icon on update? */
  71.  
  72. /*
  73.  * Construct the icons.
  74.  * None.icon is displayed when there are no new files; otherwise,
  75.  * new1.icon and new2.icon are toggled once a second.
  76.  */
  77. static short none_icon_i[] = {
  78. #include "none.icon"
  79. };
  80. mpr_static(none_icon_p, 64, 64, 1, none_icon_i);
  81.  
  82. static short new1_icon_i[] = {
  83. #include "new1.icon"
  84. };
  85. mpr_static(new1_icon_p, 64, 64, 1, new1_icon_i);
  86.  
  87. static short new2_icon_i[] = {
  88. #include "new2.icon"
  89. };
  90. mpr_static(new2_icon_p, 64, 64, 1, new2_icon_i);
  91.  
  92. Icon ikes[3];
  93. int  inum = 1;
  94. int  newstuff;
  95.  
  96. main(argc, argv)
  97. char **argv;
  98. {
  99.     ikes[0] = icon_create(ICON_IMAGE, &none_icon_p, 0);
  100.     ikes[1] = icon_create(ICON_IMAGE, &new1_icon_p, 0);
  101.     ikes[2] = icon_create(ICON_IMAGE, &new2_icon_p, 0);
  102.  
  103.     frame = window_create(NULL, FRAME,
  104.         FRAME_LABEL,        "LUMBERJACK 1.0 by Steven Grimm (koreth@ssyx.ucsc.edu)",
  105.         FRAME_ARGC_PTR_ARGV,    &argc, argv,
  106.         FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
  107.         FRAME_ICON,        ikes[0],
  108.         WIN_ERROR_MSG,        "Couldn't open window",
  109.         0);
  110.  
  111.     parse_args(argc, argv);
  112.     create_subwindows();
  113.     set_window_sizes();
  114.     load_files();
  115.  
  116.     newstuff = 0;
  117.     window_set(frame, FRAME_ICON, ikes[0], 0);
  118.  
  119.     set_notifier();
  120.  
  121.     window_main_loop(frame);
  122. }
  123.  
  124. /*
  125.  * Create all the necessary subwindows.
  126.  */
  127. create_subwindows()
  128. {
  129.     int i, domenu();
  130.  
  131.     for (i=0; i<files; i++)
  132.     {
  133.         menu[i] = menu_create(MENU_TITLE_ITEM, file[i],
  134.                 MENU_ACTION_ITEM, "Close", domenu,
  135.                 0);
  136.         text[i] = window_create(frame, TEXTSW,
  137.             WIN_ERROR_MSG,        "Couldn't create subwindow",
  138.             WIN_IGNORE_PICK_EVENT,    WIN_RESIZE,
  139.             TEXTSW_DISABLE_CD,    TRUE,
  140.             TEXTSW_DISABLE_LOAD,    TRUE,
  141.             TEXTSW_INSERT_MAKES_VISIBLE, TEXTSW_ALWAYS,
  142.             TEXTSW_IGNORE_LIMIT,    TEXTSW_INFINITY,
  143.             TEXTSW_MENU,        menu[i],
  144.             0);
  145.     }
  146. }
  147.  
  148. /*
  149.  * Set all the window sizes.  This gets called whenever the base
  150.  * frame gets resized, and once at initialization.
  151.  *
  152.  * For now, all the subwindows are assumed to be of equal size.
  153.  */
  154. set_window_sizes()
  155. {
  156.     int i, fr_height, fr_width, ts_height, ts_width;
  157.  
  158.     fr_height = (int)window_get(frame, WIN_HEIGHT) -
  159.         (int)window_get(frame, WIN_TOP_MARGIN);
  160.     fr_width = (int)window_get(frame, WIN_WIDTH) -
  161.         LMARGIN - RMARGIN;
  162.     ts_height = fr_height/files - SMARGIN;
  163.     ts_width = fr_width;
  164.  
  165.     for (i=0; i<files; i++)
  166.     {
  167.         window_set(text[i],
  168.             WIN_HEIGHT, ts_height,
  169.             WIN_WIDTH, ts_width,
  170.             0);
  171.         if (i)
  172.             window_set(text[i], WIN_BELOW, text[i-1], 0);
  173.     }
  174. }
  175.  
  176. /*
  177.  * Parse command line arguments.
  178.  * For now, this is just a list of filenames.
  179.  */
  180. parse_args(c, v)
  181. char **v;
  182. {
  183.     int i, nflag = 0;
  184.  
  185.     files = 0;
  186.     for (i=1; i<c; i++)
  187.     {
  188.         if (! strcmp(v[i], "-n"))
  189.             nflag = 1;
  190.         else if (access(v[i], R_OK) == 0)
  191.         {
  192.             file[files] = v[i];
  193.             length[files] = MAXINT;
  194.             alert[files] = !nflag;
  195.             nflag = 0;
  196.             if (++files == 16)
  197.                 break;
  198.         }
  199.         else
  200.             perror(v[i]);
  201.     }
  202.     if (! files)
  203.         exit(1);
  204. }
  205.  
  206. /*
  207.  * Load all the files into their windows, and place the cursors at the
  208.  * infinity position.  This gets called once every second.
  209.  */
  210. load_files()
  211. {
  212.     int i;
  213.     struct stat st;
  214.  
  215.     for (i=0; i<files; i++)
  216.     {
  217.         if (stat(file[i], &st) < 0 || access(file[i], R_OK))
  218.         {
  219.             kill_file(i);
  220.             continue;
  221.         }
  222.         if (st.st_size == length[i])
  223.             continue;
  224.         if (st.st_size < length[i])    /* file has gotten smaller */
  225.             window_set(text[i], TEXTSW_FILE, file[i], 0);
  226.         else if (st.st_size > length[i])
  227.         {
  228.             char *buf;
  229.             int  fd, bsiz;
  230.  
  231.             buf = (char *)malloc(bsiz = (st.st_size - length[i]));
  232.             fd = open(file[i], O_RDONLY);
  233.             if (fd < 0)
  234.             {
  235. filerror:
  236.                 free(buf);
  237.                 kill_file(i);
  238.             }
  239.             if (lseek(fd, length[i], L_SET) < 0)
  240.                 goto filerror;
  241.             if (read(fd, buf, bsiz) < 0)
  242.                 goto filerror;
  243.  
  244.             window_set(text[i],
  245.                 TEXTSW_INSERTION_POINT, TEXTSW_INFINITY,
  246.                 0);
  247.             textsw_insert(text[i], buf, bsiz);
  248.             textsw_possibly_normalize(text[i], (Textsw_index)length[i]);
  249.             free(buf);
  250.         }
  251.         length[i] = st.st_size;
  252.         if (alert[i])
  253.             newstuff++;
  254.     }
  255.     if (newstuff)
  256.         if ((int)window_get(frame, FRAME_CLOSED))
  257.         {
  258.             inum ^= 3;
  259.             window_set(frame, FRAME_ICON, ikes[inum], 0);
  260.         }
  261.         else
  262.         {
  263.             newstuff = 0;
  264.             window_set(frame, FRAME_ICON, ikes[0], 0);
  265.         }
  266. }
  267.  
  268. /*
  269.  * Handle events.
  270.  */
  271. Notify_value
  272. event(window, event, arg, type)
  273. Window window;
  274. Event *event;
  275. Notify_arg arg;
  276. Notify_event_type type;
  277. {
  278.     Notify_value value;
  279.  
  280.     value = notify_next_event_func(window, event, arg, type);
  281.     if (event_id(event) == WIN_RESIZE)
  282.         set_window_sizes();
  283.     return(value);
  284. }
  285.  
  286. /*
  287.  * Handle a menu selection.
  288.  */
  289. domenu(m, mi)
  290. Menu m;
  291. Menu_item mi;
  292. {
  293.     int win;
  294.  
  295.     for (win = 0; win < files; win++)
  296.         if (menu[win] == m)
  297.             break;
  298.     if (win == files)
  299.         return;
  300.     if ((int)menu_get(m, MENU_SELECTED) == 2)
  301.         kill_file(win);
  302. }
  303.  
  304. /*
  305.  * Kill a file, either because we got an error reading it or because
  306.  * the user said so.
  307.  */
  308. kill_file(num)
  309. int num;
  310. {
  311.     int i;
  312.  
  313.     menu_destroy(menu[num]);
  314.     window_destroy(text[num]);
  315.     if (num != files-1)
  316.     {
  317.         for (i = num+1; i < files; i++)
  318.         {
  319.             menu[i-1] = menu[i];
  320.             text[i-1] = text[i];
  321.             file[i-1] = file[i];
  322.             length[i-1] = length[i];
  323.             alert[i-1] = alert[i];
  324.         }
  325.     }
  326.     if (num == 0)
  327.         window_set(text[0], WIN_Y, 0, 0);
  328.     if (--files == 0)
  329.         exit(0);
  330.     set_window_sizes();
  331. }
  332.  
  333. /*
  334.  * Set up a timer.  It checks all the files once a second.
  335.  * Also, tell the notifier what to do about resizes and so forth.
  336.  */
  337. set_notifier()
  338. {
  339.     static struct itimerval timer; /* this is our handle */
  340.  
  341.     bzero(&timer, sizeof(timer));
  342.     timer.it_interval.tv_sec = 1;
  343.     timer.it_value.tv_sec = 1;
  344.     notify_set_itimer_func(&timer, load_files, ITIMER_REAL, &timer, NULL);
  345.     notify_interpose_event_func(frame, event, NOTIFY_SAFE);
  346. }
  347. @\Rogue\Monster\
  348. else
  349.   echo "shar: Will not over write ljack.c"
  350. fi
  351. if `test ! -s ljack.l`
  352. then
  353. echo "x - ljack.l"
  354. cat > ljack.l << '@\Rogue\Monster\'
  355. .TH LJACK LOCAL "2 September 1988"
  356. .SH NAME
  357. ljack \- monitor system logs
  358. .SH SYNOPSIS
  359. .B ljack
  360. [ -n ] file1 [[ -n ] file2 ... ]
  361. .SH DESCRIPTION
  362. .I Ljack
  363. (short for "lumberjack") runs under the SunView windowing environment.  It
  364. monitors one or more logfiles, optionally alerting the user when an update
  365. takes place.  The
  366. .BR file s
  367. specified on the command line should be readable by the user; if a file is
  368. not readable, no subwindow will be created for it.
  369. .PP
  370. .IR Ljack 's
  371. display is organized into a number of equal-sized subwindows, one for each
  372. .B file.
  373. The subwindows are standard text-editing windows (see
  374. .IR textedit (1))
  375. that can be scrolled and searched as usual.  New information is added to the
  376. appropriate subwindow as it appears in a
  377. .B file,
  378. and the display scrolls to show the new data if necessary.
  379. .PP
  380. If
  381. .I ljack
  382. is in icon form when a
  383. .B file
  384. is updated, an animated axe chops at the log in the icon to inform the user
  385. that something new has arrived.  The axe disappears when the icon is opened
  386. and closed again.
  387. .PP
  388. Up to sixteen
  389. .BR file s
  390. can be viewed; in some versions of SunOS (3.x and lower) there are not enough
  391. file descriptors to view more than six files.
  392. .SH OPTION
  393. .IP \fB\-n\fR
  394. If a
  395. .B file
  396. is preceded by a \-n argument, the axe will not appear when the
  397. .B file
  398. is updated.
  399. .SH AUTHOR
  400. Steven Grimm, koreth@ssyx.ucsc.edu
  401. .SH "SEE ALSO"
  402. textedit(1), suntools(1)
  403. @\Rogue\Monster\
  404. else
  405.   echo "shar: Will not over write ljack.l"
  406. fi
  407. if `test ! -s new1.icon`
  408. then
  409. echo "x - new1.icon"
  410. cat > new1.icon << '@\Rogue\Monster\'
  411. /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
  412.  */
  413.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  414.     0x01FF,0x0000,0x0000,0x0000,0x060F,0xFC00,0x0000,0x0000,
  415.     0x09F3,0xFFF8,0x0000,0x0000,0x1209,0xFFFF,0xE000,0x0000,
  416.     0x24E4,0xF7FF,0xFFC0,0x0000,0x2B1A,0xFFFF,0xFFF8,0x0000,
  417.     0x5209,0x7FF7,0xFFFC,0x0000,0x5445,0x77FF,0xFFBE,0x0000,
  418.     0x54A5,0x7FFF,0xFFFE,0x0000,0x5445,0x7FFF,0xFBFE,0x0000,
  419.     0x5209,0x7FFF,0xDFFE,0x0000,0x2B1A,0xFDFB,0x9FFE,0x0000,
  420.     0x24E4,0xFFFF,0x1EFC,0x0000,0x1209,0xFFFE,0x1FF8,0x0000,
  421.     0x09F3,0xBFBC,0x0FF0,0x0000,0x060F,0xFFF8,0x0C00,0x0000,
  422.     0x01FF,0xE010,0x0400,0x0000,0x0000,0x001E,0x0300,0x0000,
  423.     0x0000,0x0001,0xC180,0x0000,0x0000,0x0000,0xB0C0,0x0000,
  424.     0x0000,0x0000,0x98C0,0x0000,0x0000,0x0001,0x1D00,0x0000,
  425.     0x0000,0x0002,0x2600,0x0000,0x0000,0x0004,0x2000,0x0000,
  426.     0x0000,0x0004,0x4000,0x0000,0x0000,0x0008,0x8000,0x0000,
  427.     0x0000,0x0011,0x0000,0x0000,0x0000,0x0021,0x0000,0x0000,
  428.     0x0000,0x0022,0x0000,0x0000,0x0000,0x0044,0x0000,0x0000,
  429.     0x0000,0x0088,0x0000,0x0000,0x0000,0x0090,0x0000,0x0000,
  430.     0x0000,0x0110,0x0000,0x0000,0x0000,0x0220,0x0000,0x0000,
  431.     0x0000,0x0440,0x0000,0x0000,0x0000,0x0480,0x0000,0x0000,
  432.     0x0000,0x0880,0x0000,0x0000,0x0000,0x1100,0x0000,0x0000,
  433.     0x0000,0x2200,0x0000,0x0000,0x0000,0x2400,0x0000,0x0000,
  434.     0x0000,0x4400,0x0000,0x0000,0x0000,0x2800,0x0000,0x0000,
  435.     0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  436.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  437.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  438.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  439.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  440.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  441.     0x1000,0x0400,0x0040,0x0040,0x1049,0xA70C,0x5003,0x0E48,
  442.     0x1049,0x5492,0x68C0,0x9050,0x1049,0x549C,0x4043,0x9060,
  443.     0x1059,0x5490,0x4044,0x9050,0x1E29,0x570E,0x4042,0x8E48,
  444.     0x0000,0x0000,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000
  445. @\Rogue\Monster\
  446. else
  447.   echo "shar: Will not over write new1.icon"
  448. fi
  449. if `test ! -s new2.icon`
  450. then
  451. echo "x - new2.icon"
  452. cat > new2.icon << '@\Rogue\Monster\'
  453. /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
  454.  */
  455.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  456.     0x01FF,0x0000,0x0000,0x0000,0x060F,0xFC00,0x0000,0x0000,
  457.     0x09F3,0xFFF8,0x0000,0x0000,0x1209,0xFFFF,0xE000,0x0000,
  458.     0x24E4,0xF7FF,0xFFC0,0x0000,0x2B1A,0xFFFF,0xFFF8,0x0000,
  459.     0x5209,0x7FF7,0xFFFC,0x0000,0x5445,0x77FF,0xFFBE,0x0000,
  460.     0x54A5,0x7FFF,0xFFFE,0x0000,0x5445,0x7FFF,0xFBFE,0x0000,
  461.     0x5209,0x7FFF,0xFFFE,0x0000,0x2B1A,0xFDFB,0xFFFE,0x0000,
  462.     0x24E4,0xFFFF,0xFEFC,0x0000,0x1209,0xFFFF,0xFFF8,0x0000,
  463.     0x09F3,0xBFBF,0xFFF0,0x0000,0x060F,0xFFFF,0x0000,0x0000,
  464.     0x01FF,0xE000,0x0000,0x0000,0x0000,0x0000,0x0038,0x0000,
  465.     0x0000,0x0000,0x00C8,0x0000,0x0000,0x0000,0x0310,0x0000,
  466.     0x0000,0x0000,0x0C10,0x0000,0x0000,0x0000,0x3010,0x0000,
  467.     0x0000,0x0000,0x3810,0x0000,0x0000,0x0000,0x0610,0x0000,
  468.     0x0000,0x0000,0x0118,0x0000,0x0000,0x0000,0x0108,0x0000,
  469.     0x0000,0x0000,0x0684,0x0000,0x0000,0x0000,0x0884,0x0000,
  470.     0x0000,0x0000,0x3066,0x0000,0x0000,0x0000,0x4198,0x0000,
  471.     0x0000,0x0001,0x8210,0x0000,0x0000,0x0002,0x0C00,0x0000,
  472.     0x0000,0x000C,0x3000,0x0000,0x0000,0x0010,0x4000,0x0000,
  473.     0x0000,0x0061,0x8000,0x0000,0x0000,0x0082,0x0000,0x0000,
  474.     0x0000,0x030C,0x0000,0x0000,0x0000,0x0410,0x0000,0x0000,
  475.     0x0000,0x1860,0x0000,0x0000,0x0000,0x2180,0x0000,0x0000,
  476.     0x0000,0x2200,0x0000,0x0000,0x0000,0x1C00,0x0000,0x0000,
  477.     0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  478.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  479.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  480.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  481.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  482.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  483.     0x1000,0x0400,0x0040,0x0040,0x1049,0xA70C,0x5003,0x0E48,
  484.     0x1049,0x5492,0x68C0,0x9050,0x1049,0x549C,0x4043,0x9060,
  485.     0x1059,0x5490,0x4044,0x9050,0x1E29,0x570E,0x4042,0x8E48,
  486.     0x0000,0x0000,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000
  487. @\Rogue\Monster\
  488. else
  489.   echo "shar: Will not over write new2.icon"
  490. fi
  491. if `test ! -s none.icon`
  492. then
  493. echo "x - none.icon"
  494. cat > none.icon << '@\Rogue\Monster\'
  495. /* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
  496.  */
  497.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  498.     0x01FF,0x0000,0x0000,0x0000,0x060F,0xFC00,0x0000,0x0000,
  499.     0x09F3,0xFFF8,0x0000,0x0000,0x1209,0xFFFF,0xE000,0x0000,
  500.     0x24E4,0xF7FF,0xFFC0,0x0000,0x2B1A,0xFFFF,0xFFF8,0x0000,
  501.     0x5209,0x7FF7,0xFFFC,0x0000,0x5445,0x77FF,0xFFBE,0x0000,
  502.     0x54A5,0x7FFF,0xFFFE,0x0000,0x5445,0x7FFF,0xFBFE,0x0000,
  503.     0x5209,0x7FFF,0xFFFE,0x0000,0x2B1A,0xFDFB,0xFFFE,0x0000,
  504.     0x24E4,0xFFFF,0xFEFC,0x0000,0x1209,0xFFFF,0xFFF8,0x0000,
  505.     0x09F3,0xBFBF,0xFFF0,0x0000,0x060F,0xFFFF,0x0000,0x0000,
  506.     0x01FF,0xE000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  507.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  508.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  509.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  510.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  511.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  512.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  513.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  514.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  515.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  516.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  517.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  518.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  519.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  520.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  521.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  522.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  523.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  524.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  525.     0x1000,0x0400,0x0040,0x0040,0x1049,0xA70C,0x5003,0x0E48,
  526.     0x1049,0x5492,0x68C0,0x9050,0x1049,0x549C,0x4043,0x9060,
  527.     0x1059,0x5490,0x4044,0x9050,0x1E29,0x570E,0x4042,0x8E48,
  528.     0x0000,0x0000,0x0180,0x0000,0x0000,0x0000,0x0000,0x0000
  529. @\Rogue\Monster\
  530. else
  531.   echo "shar: Will not over write none.icon"
  532. fi
  533. # to concatenate archives, remove anything after this line
  534. exit 0
  535.  
  536.